package com.xzmzhp.dao.people;

import com.xzmzhp.dao.people.SQL.PersonnelSQL;
import com.xzmzhp.pojo.people.Personnel;
import com.xzmzhp.vo.personnel.PersonnelVo;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @author 王源(xm)
 * @Date: 2020/11/18 14:55
 * @Description: 人员信息表操作类
 */
@Repository
public interface PersonnelMapper{

    /**
     * 查询所有人员信息
     *
     * @return PersonnelVo集合
     */
    @Select("select * from personnel_view")
    List<PersonnelVo> findAll();

    /**
     * 根据人员id查询人员信息
     *
     * @param personnelId 人员id
     * @return PersonnelVo
     */
    @Select("select * from personnel_view where personnel_id = #{personnelId}")
    PersonnelVo findByPersonnelId(@Param("personnelId") int personnelId);

    /**
     * 根据人员id查询人员信息
     *
     * @param personnelId 人员id数组
     * @return PersonnelVo
     */
    @SelectProvider(type = PersonnelSQL.class, method = "findByPersonnelId")
    List<PersonnelVo> findByPersonnelIds(@Param("personnelId") Integer[] personnelId);

    /**
     * 根据人员学号查询人员信息
     *
     * @param studentId 学号
     * @return PersonnelVo集合
     */
    @Select("select * from personnel_view where student_id = #{studentId}")
    PersonnelVo findByStudentId(@Param("studentId") String studentId);

    /**
     * 根据人员姓名、权限名称、部门名称、年级其中的一个或多个查询人员数据
     *
     * @param personnelName  人员姓名
     * @param competenceName 权限名称
     * @param positionName   部门名称
     * @param personnelGrade 年级
     * @return PersonnelVo集合
     */
    @SelectProvider(type = PersonnelSQL.class, method = "findPersonnel")
    List<PersonnelVo> findPersonnel(@Param("personnelName") String personnelName, @Param("competenceName") String competenceName,
                                    @Param("positionName") String positionName, @Param("personnelGrade") int personnelGrade);

    /**
     * 根据人员姓名、权限id、部门id、年级其中的一个或多个查询人员数据
     *
     * @param competenceId   权限id
     * @param positionId     部门id
     * @param personnelGrade 年级
     * @param personnelId    人员id
     * @return Personnel集合
     */
    @SelectProvider(type = PersonnelSQL.class, method = "findPersonnelId")
    List<Personnel> checkPersonnel(@Param("competenceId") int competenceId, @Param("positionId") int positionId,
                                   @Param("personnelGrade") int personnelGrade, @Param("personnelId") int personnelId);

    /**
     * 根据id查询活动名称
     *
     * @param personnelId 人员id
     * @return 活动名称
     */
    @Select("select activity_name from activity where activity_id in (" +
            "select activity_personnel.activity_id from activity_personnel where activity_personnel.personnel_id = #{personnelId}" +
            ")")
    List<String> findActivityNames(@Param("personnelId") int personnelId);

    /**
     * 查询部门人数
     * @param positionId 部门id
     * @param grade 年级
     * @return 部门总人数
     */
    @SelectProvider(type = PersonnelSQL.class, method = "findPositionPeoples")
    Integer findPositionPeoples(@Param("positionId") int positionId,@Param("grade") Integer grade);

    /**
     * 添加人员信息
     *
     * @param personnel 人员信息实体类
     * @return 影响条数
     */
    @Insert("insert into personnel values(null,#{studentId},#{personnelName}," +
            "#{competenceId},#{personnelPhone},#{personnelPassword}," +
            "#{personnelGrade},#{personnelAcademy},#{personnelClasses}," +
            "#{positionId},null,null)")
    Integer addPersonnel(Personnel personnel);

    /**
     * 修改人员信息
     *
     * @param personnel 人员信息实体类
     * @return 影响条数
     */
    @UpdateProvider(type = PersonnelSQL.class, method = "updatePersonnel")
    Integer updatePersonnel(Personnel personnel);


    /**
     * 批量修改人员部门
     * @param primaryPositionId 原部门id
     * @param targetPositionId  目标部门id
     * @param grade 年级
     * @return 修改信息
     */
    @Update("update personnel set position_id = #{targetPositionId} where position_id = #{primaryPositionId} and personnel_grade = #{grade}")
    Integer exitBatchPosition(@Param("primaryPositionId") Integer primaryPositionId, @Param("targetPositionId") Integer targetPositionId, Integer grade);

    /**
     * 删除人员信息
     *
     * @param personnelId 人员id
     * @return 影响条数
     */
    @Delete("delete from personnel where personnel_id = #{personnelId}")
    Integer deletePersonnel(@Param("personnelId") int personnelId);


}
